const md5 = require('md5')
const mysql = require('mysql')
const config = require('./config')
const jsonwebtoken = require('jsonwebtoken')
const express = require('express')
const multer  = require('multer')
const moment  = require('moment')
const fs  = require('fs')
const path  = require('path')

/************* md5 */
function md5hash(data) {
    return md5(data + config.secret)
}

/************ jwt */
const jwtRouter = express.Router()
jwtRouter.use((req, res, next) => {
  let authorization = req.headers.authorization
  if(authorization === undefined) {
      res.json({
          'ok': 0,
          'error': '令牌无效！'
      })
      return false
  }
  let token = authorization.substring(7)
  try {
    let data = jsonwebtoken.verify(token, config.secret)
    req.user = data
    next()
  } catch(err) {
    res.json({
        'ok': 0,
        'error': '令牌无效！'
    })
  }
})
function jwt(data) {
    return jsonwebtoken.sign(data, config.secret)
}

/*********** db */
const db = mysql.createPool(config.db)

/************ 时间 */
function time() {
  let time = new Date().getTime().toString()
  return time.substring(0, 10)
}

/************ 上传 */
const upload = multer({
  storage: multer.diskStorage({
    // 配置保存文件的路径
    destination: function (req, file, cb) {
      // 获取今天的日期
      let today = moment().format('YYYYMMDD')
      let imageDir = path.join(config.uploads.root, today)
      // 判断目录是否存在
      fs.access(imageDir, (err) => {
          if(err) {
              // 创建目录
              fs.mkdir(imageDir, err=>{
                  if(err) return 
              })
          }
          // 返回文件目录
          cb(null, imageDir)
      })
    },
    // 自定义上传文件名
    filename: function (req, file, cb) {
      let newName = Date.now() + '.' + file.originalname.substr(file.originalname.lastIndexOf('.') + 1)
      cb(null, newName)
    }
  }),
  // 最大尺寸限制
  limits: {
    fileSize: config.uploads.maxFileSize
  },
  // 自定义上传过滤器
  fileFilter: (req, file, cb)=>{
    // 文件类型
    if(config.uploads.allowType.indexOf(file.mimetype) !== -1)
      cb(null, true)
    else
      cb(new Error('不允许上传的类型'))
  }
})

module.exports = {
    md5hash,
    jwt,
    jwtRouter,
    db,
    time,
    upload
}